package com.teaphy.sort;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Spliterator;
import java.util.function.IntBinaryOperator;
import java.util.function.IntUnaryOperator;
import java.util.stream.Collector;
import java.util.stream.Collectors;

public class TestSort {

	public static void main(String[] args) {
		int[] arrayAge = new int[4];

		arrayAge[0] = 20;
		arrayAge[1] = 5;
		arrayAge[2] = 10;
		arrayAge[3] = 7;

//		// Arrays.binarySearch采用二分法查找指定值位于指定数组中的位置
//		// 如果值存在，返回位置;否则，返回一个负数
//		// 采用二分法查找时，可以指定开始位置和结束位置
//		// 二分法查找只适用于排序后的数组
//		int index1 = Arrays.binarySearch(arrayAge, 10);
//		System.out.println("index1: " + index1);
//
//		int index2 = Arrays.binarySearch(arrayAge, 100);
//		System.out.println("index2: " + index2);
//
//		// 判断在arrayInt中，在0和1之间是否存在10
//		int index3 = Arrays.binarySearch(arrayAge, 0, 1, 10);
//		System.out.println("index3: " + index3);
//
//		// 对于基本数据类型，可以直接调用
//		// 对于对象而言，需要指定查找条件，其实现 Comparator 接口
//		Student[] arrayStudent = new Student[5];
//		Student searchStudent1 = new Student(3);
//		Student searchStudent2 = new Student(45);
//		arrayStudent[0] = new Student(1, "A");
//		arrayStudent[1] = new Student(2, "B");
//		arrayStudent[2] = new Student(3, "C");
//		arrayStudent[3] = new Student(4, "D");
//		arrayStudent[4] = new Student(5, "E");
//
//		int indexStu1 = Arrays.binarySearch(arrayStudent, searchStudent1,
//			new Comparator<Student>() {
//				@Override
//				public int compare(Student o1, Student o2) {
//					return o1.id - o2.id;
//				}
//			});
//
//		int indexStu2 = Arrays.binarySearch(arrayStudent, searchStudent2,
//			new Comparator<Student>() {
//				@Override
//				public int compare(Student o1, Student o2) {
//					return o1.id - o2.id;
//				}
//			});
//
//		System.out.println("indexStu1: " + indexStu1);
//		System.out.println("indexStu2: " + indexStu2);
//
//		// 通过填充，获得长度为6的数组
//		Student[] arrayStudent1 = Arrays.copyOf(arrayStudent, 6);
//		System.out.println("arrayStudent1: " + Arrays.toString(arrayStudent1));
//		// copyOf是浅拷贝
//		arrayStudent1[0].name = "new Name";
//		System.out.println("arrayStudent[0]: " + arrayStudent[0].toString());
//		System.out.println("arrayStudent1[0]: " + arrayStudent1[0].toString());

		// fill
		// 将数组的所有元素设置为指定的值
//		Arrays.fill(arrayAge, 36);
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));

		// parallelPrefix
		// 从起始位置开始，并行按照给定xxBinaryOperator函数，累积数组中的每个元素。
		// 例如，如果数组起始为[1, 2, 3, 4]，添加操作-IntBinaryOperator函数为 （left+right）
		// 那么返回的数组为[1, 3, 6, 10]
		// 返回的数组的特点：
		// 1. 数组长度与原数组相同
		// 2. 起始元素与原数组的起始元素相同，即new[0] = old[0]
		// 3. 第i个元素为原数组中从0到i-1个范围内的元素按照给定操作的求值
//		System.out.println("----------------- parallelPrefix -> start ---------------");
//
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//		Arrays.parallelPrefix(arrayAge, (left, right) -> {
//			System.out.println("left: " + left + "　｜　right: " + right);
//			return left + right;
//		});
//
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//
//		System.out.println("----------------- parallelPrefix -> end ---------------");

		// parallelSetAll
//		System.out.println("----------------- parallelSetAll -> start ---------------");
//
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//		Arrays.parallelSetAll(arrayAge, position -> {
//			int valueOld = arrayAge[position];
//			int valueNew = valueOld * 2;
//
//			System.out.println("position: " + position + " | valueOld: " + valueOld + " | valueNew: " + valueNew);
//
//			return valueNew;
//		});
//
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//
//		System.out.println("----------------- parallelSetAll -> end ---------------");

//		// parallelSort
//		// 排序算法是并行排序合并，它将数组分解为自身排序然后合并的子数组。
//		System.out.println("----------------- parallelSort -> start ---------------");
//
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//		Arrays.parallelSort(arrayAge);
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//
//		System.out.println("----------------- parallelSort -> end ---------------");

//		// setAll
//		// 采用同步方式,通过给定的操作，对数组的每个元素赋值
//		System.out.println("----------------- setAll -> start ---------------");
//
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//
//		Arrays.setAll(arrayAge, position -> {
//			int value = position * position;
//			System.out.println("position: " + position);
//			return value;
//		});
//
//		System.out.println("arrayAge: " + Arrays.toString(arrayAge));
//
//		System.out.println("----------------- setAll -> end ---------------");


	}
}
